﻿namespace AladdinGameFramework
{
	public static partial class Utility
	{
		/// <summary>
		/// 随机相关的实用函数
		/// </summary>
		public static class Random
		{
			/// <summary>
			/// 伪随机
			/// </summary>
			private static readonly System.Random s_Random = new System.Random();
			/// <summary>
			/// 真随机
			/// </summary>
			private static readonly System.Random m_Random = new System.Random((int)(System.DateTime.Now.Ticks & 0xffffffffL) | (int)(System.DateTime.Now.Ticks >> 32));

			/// <summary>
			/// 返回一个非负随机数
			/// </summary>
			/// <returns>大于等于0并且小于System.Int32.MaxValue的32位带符号的整数</returns>
			public static int GetRandom(bool realRandom = false)
			{
				if (realRandom)
					return m_Random.Next();
				else
					return s_Random.Next();
			}

			/// <summary>
			/// 返回一个小于所指定最大值的非负随机数。
			/// </summary>
			/// <param name="maxValue">要生成的随机数的上界（随机数不能取该上界值）。maxValue 必须大于等于零。</param>
			/// <returns>大于等于零且小于 maxValue 的 32 位带符号整数，即：返回值的范围通常包括零但不包括 maxValue。不过，如果 maxValue 等于零，则返回 maxValue。</returns>
			public static int GetRandom(int maxValue, bool realRandom = false)
			{
				if (realRandom)
					return m_Random.Next(maxValue);
				else
					return s_Random.Next(maxValue);
			}

			/// <summary>
			/// 返回一个介于0.0和1.0之间的随机数
			/// </summary>
			/// <param name="realRandom">大于等于 0.0 并且小于 1.0 的双精度浮点数。</param>
			/// <returns></returns>
			public static double GetRandomDouble(bool realRandom = false)
			{
				if (realRandom)
					return m_Random.NextDouble();
				else
					return s_Random.NextDouble();
			}

			/// <summary>
			/// 用随机数填充指定字节数组的元素
			/// </summary>
			/// <param name="buffer"></param>
			/// <param name="realRamdom"></param>
			public static void GetRandomBytes(byte[] buffer, bool realRamdom = false)
			{
				if (realRamdom)
					m_Random.NextBytes(buffer);
				else
					s_Random.NextBytes(buffer);
			}
		}
	}
}
